/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Util;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import javax.swing.JOptionPane;

/**
 *
 * @author Javi
 */
final public class GestorConfiguracion {

    private static GestorConfiguracion _INSTANCIA = new GestorConfiguracion();
    private static final String NOM_FICH_PROPS = "perfiles.properties";
    //Nombres de las propiedades de Base de Datos
    public static final String USUARIO_BD = "usuarioBD";
    public static final String PASSWORD_BD = "passwordBD";
    public static final String HOST_BD = "hostBD";
    public static final String PUERTO_BD = "puertoBD";
    public static final String BASE_DATOS = "baseDatos";
    public static final String MIN_DENEGA_AUTO = "MinDenegaAuto";
    public static final String MAX_AUTORIZ_AUTO = "MaxAutorizAuto";

    //Nombre de la entidad "lógica" de la Base de Datos
    private String _sNombreTabla = "Configuracion";
    //Descripción de la tabla "virtual" de la Base de Datos
    private String _sDescripTabla = "Configuracion";

    private Properties _properties;

    private GestorConfiguracion (){
        this._properties = new Properties();
        this.load();
    }

    public static GestorConfiguracion getInstancia (){
        return _INSTANCIA;
    }

    public String getProperty (String nomPropiedad){
        return this._properties.getProperty(nomPropiedad);
    }

    public void setProperty (String nomPropiedad, String sValor){
        this._properties.setProperty(nomPropiedad, sValor);
    }

    /**
     * Carga en el fichero de configuración el fichero de propiedades de la aplicaci´n
     */
    public void load(){
        try {
            FileInputStream in = new FileInputStream(NOM_FICH_PROPS);
            this._properties.load(in);
            in.close();
        } catch (IOException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(null,"Error al cargar el fichero de configuracion" ,"Aviso",JOptionPane.WARNING_MESSAGE);
        }
    }

    /**
     * Graba en el fichero de configuración el fichero de propiedades de la aplicaci´n
     * No hace validaciones y por eso es private
     */
    private void store(){
        try {
            FileOutputStream out = new FileOutputStream(NOM_FICH_PROPS);
            this._properties.store(out, "Fichero de propiedades de la aplicación");
            out.close();
        } catch (IOException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(null,"Error al grabar el fichero de configuracion" ,"Aviso",JOptionPane.WARNING_MESSAGE);
        }
    }


    /**
     * Graba en el fichero de configuración el fichero de propiedades de la aplicaci´n
     * Hace las validaciones necesarias
     */
    public boolean update (){
        if ( !validar () )
            return false;
        this.store();
        return true;
    }


    /*
     * Valida los datos de la clase antes de hacer una actualización.
     * Se informa de los errores que se produzcan mediante un vector de String.
     */
    public boolean validar (){
        int iMinDenegAuto, iMaxAutorizAuto;
        if ( this.getProperty(BASE_DATOS).trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El nombre de la base de datos es obligatorio");
        if ( this.getProperty(HOST_BD).trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El nombre del Host datos es obligatorio");
        if ( Integer.parseInt(this.getProperty(PUERTO_BD).trim()) == 0 )
            GestorErrores.getInstancia().getvErrores().add ("El número de puerto es obligatorio");
        if ( this.getProperty(USUARIO_BD).trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El nombre del usuario es obligatorio");
        if ( this.getProperty(MIN_DENEGA_AUTO).trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El umbral mínimo para denegar automáticamente la solicitud de préstamo es obligatorio");
        if ( this.getProperty(MAX_AUTORIZ_AUTO).trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El umbral máximo para autorizar automáticamente la solicitud de préstamo es obligatorio");
        iMinDenegAuto = Integer.parseInt(GestorConfiguracion.getInstancia().getProperty(GestorConfiguracion.MIN_DENEGA_AUTO));
        iMaxAutorizAuto = Integer.parseInt(GestorConfiguracion.getInstancia().getProperty(GestorConfiguracion.MAX_AUTORIZ_AUTO));
        if ( iMinDenegAuto < 0 || iMinDenegAuto > 100 )
            GestorErrores.getInstancia().getvErrores().add ("El umbral mínimo para denegar automáticamente debe estar entre 0 y 100");
        if ( iMaxAutorizAuto < 0 || iMaxAutorizAuto > 100 )
            GestorErrores.getInstancia().getvErrores().add ("El umbral máximo para autorizar automáticamente debe estar entre 0 y 100");
        if ( iMaxAutorizAuto > iMinDenegAuto )
            GestorErrores.getInstancia().getvErrores().add ("El umbral máximo para autorizar automáticamente NO puede exceder el umbral mínimo para denegar automáticamente ");
        return (GestorErrores.getInstancia().getvErrores().size () == 0);
    }

    public String getsNombreTabla() {
        return _sNombreTabla;
    }

    public void setsNombreTabla(String _sNombreTabla) {
        this._sNombreTabla = _sNombreTabla;
    }

    public String getsDescripTabla() {
        return _sDescripTabla;
    }

    public void setsDescripTabla(String _sDescripTabla) {
        this._sDescripTabla = _sDescripTabla;
    }
}
